/*
 * @Author: _oufen
 * @Date: 2023-07-06 15:05:38
 * @LastEditTime: 2023-07-07 16:55:46
 * @Description:
 */
#include "usart3.h"

int Bluetooth_Receive_Buff[6]; // 蓝牙接收数据
int16_t data1;                 // 三个有效数据位  第一个为  模式选择
int16_t data2;                 // 第二个为  停车标志
int16_t data3;                 // 第三个为   主车走的圈数

/**
 * @brief 	串口3初始化
 * @param 	无
 * @retval  无
 */
void uart3_init(u32 bound)
{
    // GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能USART3，GPIOB时钟

    // USART3_TX   GPIOB2       RX 	PA2
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // PA2
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
    GPIO_Init(GPIOB, &GPIO_InitStructure);          // 初始化GPIOB2

    // USART3_RX	GPIOB3   	TX  	PA3
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;            // PB11
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
    GPIO_Init(GPIOB, &GPIO_InitStructure);                // 初始化GPIOB3

    // USART3 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 抢占优先级3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        // 子优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           // IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);                           // 根据指定的参数初始化VIC寄存器

    // USART 初始化设置
    USART_InitStructure.USART_BaudRate = bound;                                     // 串口波特率
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;                     // 字长为8位数据格式
    USART_InitStructure.USART_StopBits = USART_StopBits_1;                          // 一个停止位
    USART_InitStructure.USART_Parity = USART_Parity_No;                             // 无奇偶校验位
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无硬件数据流控制
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                 // 收发模式

    USART_Init(USART3, &USART_InitStructure);      // 初始化串口2
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); // 开启串口接受中断
    USART_Cmd(USART3, ENABLE);                     // 使能串口2
}

/**
 * @brief 	串口3发送数据包
 * @param 	无
 * @retval  无
 */
void u3_sendData(u8 *str)
{

    u8 i = 0;
    for (i = 0; i < 2; i++) // b3 b3
    {
        USART_SendData(USART3, 0xb3);
        while (USART_GetFlagStatus(USART3, USART_FLAG_TC) != SET)
            ;
    }

    for (i = 0; i < 3; i++) // 发送三位有效位
    {
        USART_SendData(USART3, str[i]);
        while (USART_GetFlagStatus(USART3, USART_FLAG_TC) != SET)
            ;
    }

    USART_SendData(USART3, 0x5b); // 0x5b
    while (USART_GetFlagStatus(USART3, USART_FLAG_TC) != SET)
        ;
}

void Bluetooth_Data(void) // 处理蓝牙接收的数据
{
    data1 = Bluetooth_Receive_Buff[2];
    data2 = Bluetooth_Receive_Buff[3];
    data3 = Bluetooth_Receive_Buff[4];
}

/**
 * @brief 	串口3接收数据包  解析接收数据包   解析数据包   b3 b3 data1 data2 data3 5b
 * @param 	无
 * @retval  无
 */
void Bluetooth_Receive_Data(int16_t data)
{
    int i = 0;
    static u8 state = 0; // 初始化状态值

    if (state == 0 && data == 0xb3) // 第一个帧头 0xb3
    {
        state = 1;
        Bluetooth_Receive_Buff[0] = data;
    }
    else if (state == 1 && data == 0xb3) // 第二个帧头  0xb3
    {
        state = 2;
        Bluetooth_Receive_Buff[1] = data;
    }
    else if (state == 2) // 第一个有效数据
    {
        state = 3;
        Bluetooth_Receive_Buff[2] = data;
    }
    else if (state == 3) // 第二个有效数据
    {
        state = 4;
        Bluetooth_Receive_Buff[3] = data;
    }
    else if (state == 4) // 第三个有效数据
    {
        state = 5;
        Bluetooth_Receive_Buff[4] = data;
    }
    else if (state == 5) // 接收帧尾
    {
        if (data == 0x5b) // 是帧尾  直接回到初始状态
        {
            state = 0;
            Bluetooth_Receive_Buff[5] = data;
            Bluetooth_Data(); // 处理数据
        }
        else if (data != 0x5b) // 不是帧尾  所有数据置0
        {
            state = 0;
            for (i = 0; i < 6; i++)
            {
                Bluetooth_Receive_Buff[i] = 0;
            }
        }
    }
    else
    {
        state = 0;
        for (i = 0; i < 6; i++)
        {
            Bluetooth_Receive_Buff[i] = 0;
        }
    }
}

/**
 * @brief 	串口3接收中断
 * @param 	无
 * @retval  无
 */
void USART3_IRQHandler(void) // 串口2中断服务程序
{
    uint8_t ReceiveData;
    if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) // 接收中断(接收到的数据必须是0x0d 0x0a结尾)
    {

        USART_ClearITPendingBit(USART3, USART_IT_RXNE); // 清除中断标志

        ReceiveData = USART_ReceiveData(USART3); // 接收的数据

        Bluetooth_Receive_Data(ReceiveData);

        Bluetooth_Data();

        // USART_SendData(USART3, ReceiveData);
        //  测试收发数据
        // if (ReceiveData == 58) // 当接收到0x3A后  接收数据灯亮    这个是基于最小系统板的测试程序
        // {
        //     MY_GPIO_Init(GPIOC, GPIO_Pin_13, GPIO_Mode_Out_PP);
        // }
    }
}

/********************************* 测试蓝牙接收数据 ****************************************************/

// 在主函数中显示  但是要先引入usart3头文件   注意要在主函数中初始化  连线连接无错误

// 在上位机中以定义协议格式发送 b3 b3 01 02 03 5b

// 接收数据在OLED上显示  如发送数据和接收数据相同 则表示接收协议无错误

// 下一步就是接收蓝牙主机的数据

// // 显示串口3接收数据  这是蓝牙从机  接收数据
// OLED_ShowNum(3, 8, data1, 2);  // 有效数据1
// OLED_ShowNum(3, 11, data2, 2); // 有效数据2
// OLED_ShowNum(3, 14, data3, 2); // 有效数据3

/*********************************** 结束 *************************************************************/
